package mall

import (
	"e_mall_server/models"
	"e_mall_server/service"
	"github.com/gin-gonic/gin"
	"go.uber.org/zap"
	"strconv"
)

// GetCartList 获取购物车列表接口
func GetCartList(c *gin.Context) {
	// 无查询条件
	cartResponse, err := service.GetCartList(c)
	if err != nil {
		zap.L().Error("service.GetCartList(c) failed", zap.Error(err))
		ResponseError(c, "查询购物车列表失败")
		return
	}
	zap.L().Debug("购物车相关数据", zap.Any("value", cartResponse))
	ResponseSuccess(c, cartResponse)
}

// GetCheckedCartList 获取选中的购物车列表接口
func GetCheckedCartList(c *gin.Context) {
	cartResponse, err := service.GetCheckedCartList(c)
	if err != nil {
		zap.L().Error("service.GetCheckedCartList(c) failed", zap.Error(err))
		ResponseError(c, "查询购物车列表失败")
		return
	}
	zap.L().Debug("购物车相关数据", zap.Any("value", cartResponse))
	ResponseSuccess(c, cartResponse)
}

// AddCart 添加购物车信息接口
func AddCart(c *gin.Context) {

	// 获取商品id
	goodsId, err := strconv.ParseInt(c.Param("id"), 10, 64)
	if err != nil {
		zap.L().Error("AddCart with invalid param", zap.Error(err))
		ResponseError(c, "请求参数错误")
		return
	}

	// 业务逻辑处理
	cartResponse, err := service.AddCart(c, goodsId)
	if err != nil {
		zap.L().Error("service.AddCart(c, goodsId) failed", zap.Error(err))
		ResponseError(c, "加入购物车失败 请重试")
		return
	}

	// 创建成功返回响应
	ResponseSuccess(c, cartResponse)
}

// UpdateCartNum 修改购物车商品数量（把商品状态改为选中），需要传入用户id、商品id、商品数量
func UpdateCartNum(c *gin.Context) {
	updateCartNumParam := models.UpdateCartNumParam{}
	if err := c.ShouldBind(&updateCartNumParam); err != nil {
		zap.L().Error("UpdateCartNum with invalid param", zap.Error(err))
		ResponseError(c, "请求参数错误")
		return
	}
	zap.L().Debug("updateCartNumParam数据", zap.Any("value", updateCartNumParam))
	// 业务逻辑处理
	cartResponse, err := service.UpdateCartNum(c, &updateCartNumParam)
	if err != nil {
		zap.L().Error("service.UpdateCart(c, &updateCartNumParam) failed", zap.Error(err))
		ResponseError(c, "修改购物车商品数量失败 请重试")
		return
	}
	ResponseSuccess(c, cartResponse)
}

// UpdateCartChecked 修改购物车商品是否选中，需要传入用户id、商品id、商品数量
func UpdateCartChecked(c *gin.Context) {
	updateCartCheckedParam := models.UpdateCartCheckedParam{}
	if err := c.ShouldBind(&updateCartCheckedParam); err != nil {
		zap.L().Error("UpdateCartChecked with invalid param", zap.Error(err))
		ResponseError(c, "请求参数错误")
		return
	}
	// 业务逻辑处理
	cartResponse, err := service.UpdateCartChecked(c, &updateCartCheckedParam)
	if err != nil {
		zap.L().Error("service.UpdateCartChecked(c, &updateCartCheckedParam) failed", zap.Error(err))
		ResponseError(c, "修改购物车商品是否选中失败 请重试")
		return
	}
	ResponseSuccess(c, cartResponse)
}

// UpdateCartAllChecked 修改购物车商品是否选中，需要传入用户id、商品id、商品数量
func UpdateCartAllChecked(c *gin.Context) {
	updateCartAllCheckedParam := models.UpdateCartAllCheckedParam{}
	if err := c.ShouldBind(&updateCartAllCheckedParam); err != nil {
		zap.L().Error("UpdateCartAllChecked with invalid param", zap.Error(err))
		ResponseError(c, "请求参数错误")
		return
	}
	// 业务逻辑处理
	cartResponse, err := service.UpdateCartAllChecked(c, &updateCartAllCheckedParam)
	if err != nil {
		zap.L().Error("service.UpdateCartAllChecked(c, &updateCartAllCheckedParam) failed", zap.Error(err))
		ResponseError(c, "修改购物车商品是否全选失败 请重试")
		return
	}
	ResponseSuccess(c, cartResponse)
}

// DeleteCartGoods 删除购物车商品接口
func DeleteCartGoods(c *gin.Context) {
	deleteCartGoodsParam := models.DeleteCartGoodsParam{}
	if err := c.ShouldBind(&deleteCartGoodsParam); err != nil {
		zap.L().Error("DeleteCartGoods with invalid param", zap.Error(err))
		ResponseError(c, "请求参数错误")
		return
	}
	cartResponse, err := service.DeleteCartGoods(c, &deleteCartGoodsParam)
	if err != nil {
		zap.L().Error("service.DeleteCartGoods(c, &deleteCartGoodsParam) failed", zap.Error(err))
		ResponseError(c, "删除购物车商品数量失败 请重试")
		return
	}
	ResponseSuccess(c, cartResponse)
}

// GetCartDetailById 通过id查询购物车信息
func GetCartDetailById(c *gin.Context) {
	idStr := c.Param("id")
	id, err := strconv.ParseInt(idStr, 10, 64)
	if err != nil {
		zap.L().Error("GetCartDetailById with invalid param", zap.Error(err))
		ResponseError(c, "请求参数错误")
	}
	Cart, err := service.GetCartDetailById(id)
	if err != nil {
		zap.L().Error("service.GetCartDetailById(id) failed", zap.Error(err))
		ResponseError(c, "获取管理员信息错误")
		return
	}
	ResponseSuccess(c, Cart)
}
